<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
			// 抽象工厂方法(vehic交通工具)
			var VehicleFactory = function(subType, superType){
				// 判断抽象工厂中是否有该抽象类
				if (typeof VehicleFactory[subType] === 'function') {
					function F(){};
					F.prototype = new VehicleFactory(superType)();
					subType.constructor = subType;
					subType.prototype = new F();
				} else{
					throw new Error('未创建该抽象类');
				}
			};
			// 有了抽象工厂方法，开始创建抽象类
			
			// 小汽车抽象类
			VehicleFactory.Car = function(){
				this.type = 'car';
			};
			VehicleFactory.Car.prototype = {
				getPrice : function(){
					return new Error('抽象方法不能调用');
				},
				getSpeed : function(){
					return new Error('抽象方法不能调用');
				}
			};
			// 公交车抽象类
			VehicleFactory.Bus = function(){
				this.type = 'bus'
			};
			VehicleFactory.Bus.prototype = {
				getPrice : function(){ 
					return new Error('抽象方法不能调用');
				},
				getSpeed : function(){
					return new Error('抽象方法不能调用');
				}
			};
			// 货车抽象类
			VehicleFactory.Truck = function(){
				this.type = 'truck'
			};
			VehicleFactory.Truck.prototype = {
				getPrice : function(){ 
					return new Error('抽象方法不能调用');
				},
				getSpeed : function(){
					return new Error('抽象方法不能调用');
				}
			};
			// 使用：本例中其实是让子类继承父类，是对子类的一个拓展，让子类继承相应的产品簇抽象类
			
			// 宝马汽车子类
			var BMW = function(price, speed){
				this.price = price;
				this.speed = speed;
			}
			// 抽象工厂实现对Car 抽象类的继承
			VehicleFactory(BMW, 'Car'); 
			BMW.prototype = {
				getPrice : function(){
					return this.price; // 价格
				},
				getSpeed : function(){
					return this.speed; // 速度
				}
			}
			// 宇通汽车子类
			var YUTONG = function(price, passenger){
				this.price = price;
				this.passenger = passenger; // 承客
			}
			// 抽象工厂实现对Bus 抽象类的继承
			VehicleFactory(YUTONG, 'Bus'); 
			YUTONG.prototype = {
				getPrice : function(){
					return this.price;
				},
				getPassenger: function(){
					return this.passenger;
				}
			}
			// 奔驰汽车子类
			var BenzTruck = function(price, trainLoad){
				this.price = price;
				this.trainLoad = trainLoad; // 装载量
			}
			// 抽象工厂实现对Truck 抽象类的继承
			VehicleFactory(BenzTruck, 'Truck'); 
			BenzTruck.prototype = {
				getPrice : function(){
					return this.price;
				},
				getTrainLoad : function(){
					return this.trainLoad;
				}
			}
			
			// 测试
			var truck = new BenzTruck(1000000, 999);
			console.log(truck.getPrice());	// 1000000
			console.log(truck.type);	// truck
		</script>
	</body>
</html>
